﻿/*======================================================================
== Copyright : BlueCurve (c)
== Licence   : Gnu/GPL v2.x
== Author    : Teddy Albina
== Email     : bluecurveteam@gmail.com
== Web site  : http://www.codeplex.com/BlueCurve
========================================================================*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace BlueCurve.MemoryCache
{
    [Serializable]
    [ComVisible(false)]
    public class ValuesCache<Tid, Tdata> : MemoryCache.IValuesCache<Tid, Tdata>
    {
        #region 'Configuration'

        /// <summary>
        /// Dictionnaire contenant les données mises en cache
        /// </summary>
        private Dictionary<Tid, Tdata> CachedObjects = new Dictionary<Tid, Tdata>();
        /// <summary>
        /// Instance local de la class
        /// http://msdn.microsoft.com/en-us/library/ms998558.aspx
        /// </summary>
        private static volatile ValuesCache<Tid, Tdata> Instance;
        /// <summary>
        /// Objet pour la synchronisation
        /// </summary>
        private static readonly object myLock = new object();

        /// <summary>
        /// Obtient une instance de la classe
        /// </summary>
        public static ValuesCache<Tid, Tdata> GetInstance
        {
            get
            {
                if (Instance == null)
                {
                    lock (myLock)
                    {
                        if (Instance == null)
                        {
                            Instance = new ValuesCache<Tid, Tdata>();
                        }
                    }
                }
                return Instance;
            }
        }

        #endregion



        #region 'Functions'

        /// <summary>
        /// Ajoute un élément dans
        /// </summary>
        /// <param name="id">Identifiant de la valeur</param>
        /// <param name="value">Valeur</param>
        public void Add(Tid id, Tdata value)
        {
            if (!CachedObjects.ContainsKey(id))
                CachedObjects.Add(id, value);
        }


        /// <summary>
        /// Supprime un élement du cache
        /// </summary>
        /// <param name="id">Identifiant de l'élement à supprimer</param>
        public void Remove(Tid id)
        {
            CachedObjects.Remove(id);
        }



        /// <summary>
        /// Permet de savoir si un élément existe dans la cache
        /// </summary>
        /// <param name="id">dentifiant de l'élement à tester</param>
        /// <returns>bool</returns>
        public bool Exist(Tid id)
        {
            return CachedObjects.ContainsKey(id);
        }
        

        /// <summary>
        /// Permet d'obtenir un élement depuis le cache
        /// </summary>
        /// <param name="id">Identifiant de l'élément à obtenir</param>
        /// <returns>Tvalue</returns>
        public Tdata Get(Tid id)
        {
            if (CachedObjects.ContainsKey(id))
                return CachedObjects[id];
            else
                return default(Tdata);
        }


        /// <summary>
        /// Permet de vider le cache
        /// </summary>
        public void Clear()
        {
            CachedObjects.Clear();
        }

        #endregion
    }
}
